iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
Python

30 天學會用 Python pandas 和 openpyxl 處理 Excel —— 成為用 Python 處理 Excel 檔案的高手系列 第 21

Python 使用 openpyxl 調整 Excel 欄位寬度【Python 處理 Excel #21】

  • 分享至 

  • xImage
  •  

本篇文章同步發布於 Python 使用 openpyxl 調整 Excel 欄位寬度【Python 處理 Excel #21】

前言

Excel 儲存格的內容長度有長有短,有時候同一個欄位所需要的欄寬差異不大,這時候可以透過設定儲存格欄寬讓欄位保持適當寬度,節省空間也方便閱讀。這篇文章介紹如何使用 Python 的 openpyxl 調整 Excel 儲存格的欄寬。


案例資料說明

這篇文章使用到的 Excel 工作表內容如下:

order_id total_amount note
0001 10500 如果有問題請聯繫手機:0912-345-678。
0002 3000 請於10月17日之前送達。包裝上不需要附贈發票。
0003 1000 不熟悉產品安裝方式,需要上門安裝服務。

如何使用 openpyxl 調整 Excel 儲存格欄寬?

下方的程式碼介紹在 openpyxl 中如何調整 Excel 儲存格的欄寬:

from openpyxl.utils import get_column_letter

def adjust_column_width(ws, fixed_width_fields):
    """
    調整工作表中指定欄位的欄寬。

    Args:
        ws (Worksheet): openpyxl 的 Worksheet 物件。
        fixed_width_fields (dict): 包含欄位名稱和對應寬度的字典。
    """
    for col in range(1, ws.max_column + 1):
        header = ws.cell(row=1, column=col).value
        for key in fixed_width_fields:
            if key in header:
                ws.column_dimensions[get_column_letter(col)].width = fixed_width_fields[key]
                break  # 找到匹配的鍵後跳出內部循環,避免重複設置

# 設定欄寬
fixed_width_fields = {
    'order_id': 8,
    'amount': 12,
    'note': 23,
}

adjust_column_width(ws, fixed_width_fields)

adjust_column_width 函數遍歷工作表的所有欄位,檢查每個欄位的標題是否匹配 fixed_width_fields 字典中的鍵。如果匹配,就將該欄位的寬度設置為字典中對應的值。

接下來分段解釋這個程式碼。

引用必要的函式庫

from openpyxl.utils import get_column_letter
  • get_column_letter 函數用於將欄位的數字索引轉換為 Excel 中的字母表示方法,例如,1 轉換為 'A'、2 轉換為 'B' 等。

定義函數

def adjust_column_width(ws, fixed_width_fields):
  • ws:這是一個 Worksheet 物件,代表 Excel 中的一個工作表。
  • fixed_width_fields:這是一個字典,包含需要調整的欄位名稱及其對應的欄位寬度。

函數內部邏輯

for col in range(1, ws.max_column + 1):
    header = ws.cell(row=1, column=col).value
  • 使用 for 循環遍歷工作表中的每一個欄位 (從 1 到最大欄位)。
  • ws.cell(row=1, column=col).value:用於取得第一列 (通常是標題列) 中每一列的值。
for key in fixed_width_fields:
    if key in header:
        ws.column_dimensions[get_column_letter(col)].width = fixed_width_fields[key]
        break  # 找到匹配的鍵後跳出內部循環,避免重複設置
  • 對於字典中的每個鍵 (即需要調整寬度的欄位名稱),檢查它是否存在於標題中。
  • 如果找到匹配的鍵,就使用 get_column_letter(col) 取得該欄位的字母表示方法,並將其寬度設置為對應的值。
  • 使用 break 跳出內部循環,避免對同一欄位重複設置寬度。
  • column_dimensions 是一個屬性,回傳一個字典,該字典的鍵是欄位的字母表示方法,例如 'A''B''C' 等,值是相應欄位的 ColumnDimension 物件。這些物件用於設定欄位的屬性,如寬度、隱藏狀態等。
  • .width 是一個屬性,用於設置或取得該欄位的寬度。它接受一個數字作為值,表示該欄位的寬度。

使用函數

fixed_width_fields = {
    'order_id': 8,
    'amount': 12,
    'note': 23,
}

adjust_column_width(ws, fixed_width_fields)
  • 定義一個字典 fixed_width_fields,包含三個欄位及其所需的寬度。
  • 最後呼叫 adjust_column_width(ws, fixed_width_fields) 函數實際調整欄位寬度。

測試用的程式碼案例

如果想要嘗試使用 openpyxl 調整儲存格欄寬,可以使用以下程式碼測試:

from openpyxl import Workbook
from openpyxl.utils import get_column_letter

def create_sample_excel():
    """
    建立一個 demo 的 Excel 檔案並調整欄寬。
    """
    # 建立 Workbook
    wb = Workbook()
    ws = wb.active
    ws.title = 'demo'

    # 增加欄位名稱與資料
    headers = ['order_id', 'total_amount', 'note']
    data = [
        ['0001', 10500, '如果有問題請聯繫手機:0912-345-678。'],
        ['0002', 3000, '請於10月17日之前送達。包裝上不需要附贈發票。'],
        ['0003', 1000, '不熟悉產品安裝方式,需要上門安裝服務。']
    ]
        
    ws.append(headers)
    for row in data:
        ws.append(row)

    # 定義欄寬
    fixed_width_fields = {
        'order_id': 8,
        'amount': 12,
        'note': 23,
    }
    
    adjust_column_width(ws, fixed_width_fields)

    # 儲存活頁簿
    wb.save('output.xlsx')

# 執行案例
if __name__ == "__main__":
    create_sample_excel()

總結

  • get_column_letter 函數用於將欄位的數字索引轉換為 Excel 的字母表示方法。
  • 透過設定 column_dimensions 的屬性 width 可以調整 Excel 欄位寬度。

本篇文章同步發布於 Python 使用 openpyxl 調整 Excel 欄位寬度【Python 處理 Excel #21】


上一篇
Python 使用 openpyxl 設定 Excel 儲存格格式【Python 處理 Excel #20】
下一篇
Python 使用 openpyxl 調整 Excel 儲存格對齊方式【Python 處理 Excel #22】
系列文
30 天學會用 Python pandas 和 openpyxl 處理 Excel —— 成為用 Python 處理 Excel 檔案的高手27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言